package inge_soft.gestoriusNuevo.business.controller.implementation;


import inge_soft.gestoriusNuevo.business.controller.validation.FiltrosEventos;
import inge_soft.gestoriusNuevo.business.service.abstraction.IUsuarioService;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.Evento;
import inge_soft.gestoriusNuevo.persistence.entity.implementation.UsuarioRegistrado;
import inge_soft.gestoriusNuevo.support.SecurityUtil;
import inge_soft.gestoriusNuevo.support.UsuarioSistema;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.NotifyChange;

import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.Sessions;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Window;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class PrincipalService {

	//utilizado para mostrar el nombre del usuario logueado o el mensaje por default
	private String nombre;
	//Utilizado para checkear si el usuario esta logueado para mostrar / ocultar los botones de iniciar/cerrar sesion.
	private boolean logueado;
	//Utilizado para setear el zul del panel de contenido
	private String srcContenido;
	private EventosViewModel em;
	
	@WireVariable("usuarioService")
	private IUsuarioService userService;
	
	
	
	public PrincipalService() {
		this.setLogueado(false);
	}
	
	
	
	public String getNombre() {
		return nombre;
	}
	
	public void setNombre(String nomb){
		this.nombre = nomb;
	}
	
	
	
	public boolean isLogueado() {
		return logueado;
	}

	public void setLogueado(boolean logueado) {
		this.logueado = logueado;
	}
	
	

	public String getSrcContenido() {
		return srcContenido;
	}
	
	public void setSrcContenido(String srcContenido) {
		this.srcContenido = srcContenido;
	}



	//Inicializa el nombre al crear el objeto
	@org.zkoss.bind.annotation.Init
	public void Init() {
		//Si existe un destino, lo cargo. De lo contrario, cargo el contenido por default 
		if(Executions.getCurrent().getParameter("destino") == null){
			System.out.println("destino = null");
			this.setSrcContenido("Bienvenido.zul");			
		}else{
			System.out.println(Executions.getCurrent().getParameter("destino"));
			this.setSrcContenido(Executions.getCurrent().getParameter("destino"));
		}
		if(SecurityUtil.getUser() != null){
			//verificar booleano -> redirigir
			String username = ((UsuarioSistema) SecurityUtil.getUser()).getUsername();
			System.out.println("username :"+username);
			if(userService == null )System.out.println("es null el service");
			UsuarioRegistrado userR = userService.obtenerUsuarioRegistrado(username);
			if(userR.isContraseniaRegenerada()){
				this.setSrcContenido("RegenerarContrasenia.zul");
			}
		}
		
	}
	
	// Do after compose de la pagina principal. Lo realiza despues del init (despues de generar el dom)
	// Aca se carga el source en el include del panel de contenido. Nosotros lo estamos guardando como atributo de la ejecucion. Si es vacio, carga el por defecto
	public void doAfterCompose() throws Exception {
		
	}
		
	@Command
	@NotifyChange(".")
	public void LogIn(){
			try {
				Map<String, Object> params = new HashMap<String, Object>();
				
				params.put("index", this);
			
				((Window)Executions.getCurrent().createComponents("Login_effect.zul", null, params)).doModal();
			} catch (Exception e) {
				e.printStackTrace();
			}
	}
	
	@Command
    public void showChildWindow() {
        Executions.createComponents("ChildWindow.zul", null,null);
 
    }
	
}
